package creatingPattern.prototype;

/**
 * 原型模式示例：奖状复制
 * 设计意图：通过克隆现有对象来创建新对象，避免直接实例化
 * 使用场景：当创建对象成本较高或需要避免直接实例化时，原型模式可提高效率
 */
public class ProtoTypeCitation {
    /**
     * 主方法：演示原型模式
     * 设计意图：通过克隆方法创建新对象
     * 使用场景：当需要创建多个相似对象时，调用此方法
     * @param args 命令行参数
     * @throws CloneNotSupportedException 如果克隆失败
     */
    public static void main(String[] args) throws CloneNotSupportedException {
        citation obj1 = new citation("张三", "同学：在2016学年第一学期中表现优秀，被评为三好学生。", "韶关学院");
        obj1.display();
        citation obj2 = (citation) obj1.clone();
        System.out.println("奖状是否相同：" + (obj1 == obj2));
        System.out.println("奖状是否相同：" + (obj1.getName() == obj2.getName()));
        System.out.println("奖状是否相同：" + (obj1.getInfo() == obj2.getInfo()));
        System.out.println("奖状是否相同：" + (obj1.getCollege() == obj2.getCollege()));
        obj2.setName("李四");
        System.out.println("奖状是否相同：" + (obj1.getName() == obj2.getName()));
        obj2.display();
        obj1.display();
    }
}

/**
 * 奖状类：实现Cloneable接口
 * 设计意图：通过克隆方法创建新对象，避免直接实例化
 * 使用场景：当需要创建多个相似对象时，克隆方法可提高效率
 */
class citation implements Cloneable {
    /**
     * 获奖者姓名
     * 设计意图：存储获奖者信息
     * 使用场景：当需要展示获奖者信息时，使用此字段
     */
    private String name;

    /**
     * 获奖信息
     * 设计意图：存储获奖信息
     * 使用场景：当需要展示获奖信息时，使用此字段
     */
    private String info;

    /**
     * 颁奖单位
     * 设计意图：存储颁奖单位信息
     * 使用场景：当需要展示颁奖单位信息时，使用此字段
     */
    private String college;

    /**
     * 构造函数
     * 设计意图：初始化奖状信息
     * 使用场景：当需要创建奖状对象时，调用此构造函数
     * @param name 获奖者姓名
     * @param info 获奖信息
     * @param college 颁奖单位
     */
    citation(String name, String info, String college) {
        this.name = name;
        this.info = info;
        this.college = college;
        System.out.println("奖状创建成功！");
    }

    /**
     * 设置获奖者姓名
     * 设计意图：修改获奖者信息
     * 使用场景：当需要修改获奖者信息时，调用此方法
     * @param name 获奖者姓名
     */
    void setName(String name) {
        this.name = name;
    }

    /**
     * 获取获奖者姓名
     * 设计意图：获取获奖者信息
     * 使用场景：当需要获取获奖者信息时，调用此方法
     * @return 返回获奖者姓名
     */
    String getName() {
        return (this.name);
    }

    /**
     * 获取获奖信息
     * 设计意图：获取获奖信息
     * 使用场景：当需要获取获奖信息时，调用此方法
     * @return 返回获奖信息
     */
    String getInfo() {
        return (this.info);
    }

    /**
     * 获取颁奖单位
     * 设计意图：获取颁奖单位信息
     * 使用场景：当需要获取颁奖单位信息时，调用此方法
     * @return 返回颁奖单位
     */
    String getCollege() {
        return (this.college);
    }

    /**
     * 显示奖状
     * 设计意图：展示奖状信息
     * 使用场景：当需要展示奖状信息时，调用此方法
     */
    void display() {
        System.out.println(name + info + college);
    }

    /**
     * 克隆方法
     * 设计意图：创建奖状对象的副本
     * 使用场景：当需要创建奖状对象的副本时，调用此方法
     * @return 返回奖状对象的副本
     * @throws CloneNotSupportedException 如果克隆失败
     */
    @Override
    public Object clone() throws CloneNotSupportedException {
        System.out.println("奖状拷贝成功！");
        return (citation) super.clone();
    }
}

